Reserving memory for incoming packets in a packet memory is a fundamental operation in forwarding planes of a network element. If the packet memory is unavailable or running low, an incoming packet may either be dropped or flow control may be asserted to the active sources such that no more packets are sent to this destination until memory becomes available. Conventional methods for reserving memory includes global packet memory reservation, in-band credit based flow control, out-of-band flow control based on a memory usage that is not priority and source specific, and flow control decision and supporting process always in a fast path.
Global packet memory reservation is simple to implement and is acceptable in most forwarding planes but it is often incorrect and unfair because it does not allow source and priority specific admittance control and flow control. In-band flow control is based on the occupancy of a fast buffer at a line input. Flow control based on usage of this buffer is not directly aware of packet memory reservations in main memory and hence it is insufficient. Furthermore, this fast buffer occupancy is influenced by a diversity of downstream logic and hence tends to lose specificity of priority and source.
Out-of-band flow control based solely on global memory usage leads to a loss of source isolated backpressure and also leads to unfairness among different traffic priorities supported by the fast path. Flow control decisions are typically made in a fast path. This may slow down the fast path and often requires an implementation of complex and expensive hardware (which may in turn require expensive internal random access memory or RAM for aliasing tables). An implementation completely in the fast path also implies that the flow control function typically lags behind the packet transmission function at the source. Thus it is conceptually a reactive mechanism rather than a preventive mechanism.